package com.tedu.api;

import com.sun.org.apache.xalan.internal.xsltc.dom.CurrentNodeListFilter;
import org.junit.Test;

import java.net.URI;
import java.util.Locale;

/**
 * JavaSE：基础语法、JavaOOP面向对象编程。JavaAPI（帮助文档，理解：字典）
 *
 * JavaApI【内置：Java编程好的】提供大量类、接口、抽象类、异常、错误
 * 【预计提供好的类库：0000，JavaAPI【只学重点】
 *
 * JavaAPI:字符串、包装类、集合【泛型】、线程
 *         多线程【并发--大数据】、IO流、Socket套接字【网络编程】
 *
 * jdk1.8.chm帮助文档  理解：新华字典  会查类、接口、抽象--使用
 * jdk版本--帮助文档  根据用什么版本jdk，查对应版本帮助文档
 *
 * 必须会查API   String类---什么包下？
 *             Java.lang【默认，不需要导入包】
 *
 * JDK1.8 StringAPI类库：构造器怎么用，方法怎么用
 * java: 错误: 无效的源发行版：17
 * maven项目：自动下载：junit版本--testing级别【识别JDK17】
 * 调整maven项目版本，17版本降级1.8版本
 * 找到pom.xml17
 *
 */
public class StringAPI {
    /**
     * JDK1.8 StringAPI类库：构造器怎么用，方法怎么用
     * 包位置：java.lang 【不需要导入包：system，String】
     * 特点：不需要导入包、不可以继承、字符数组,定义完毕无法修改
     *      可以覆盖，String类final，java字符串编码集
     *      顶级UniCode：GBK，UTF-8：任何字符对应2个字节！
     * 字符串底层：封装了字符数组及针对字符数组的操作算法
     * 字符数组===字符串
     * 定义：String str="直接量"； 给定值创建string字符串对象
     *      String str=new String（）； 创建String字符串对象
     */
    @Test
    public void testString(){
        //System.out.println("hello...");
        String str="字符串";
        System.out.println(str);
        char[] c={'字','符','串'}; //字符数组：静态字符数组
        System.out.println(c);
        //字符串创建出来，无法修改，因为String是final修饰
        String s="hello...";
        s="123";  //对对象进行覆盖
        System.out.println(s);
    }

    /**
     * 定义给定值的方式：String str=“java123”
     * java为了提高性能，针对静态字符串（字面量|常量|链接后结果）
     * 创建在String常量池中，对于重复创建静态字符串，JVM虚拟机首先
     * 会在常量池中查找，如果找到就返回对象，找不到就继续创建新对象
     * 存在String常量池
     * JVM会在虚拟机的堆内存中开辟一块空间，保存曾经使用过得字面量|常量|
     * 一旦后期又使用相同的字面量|常量，不会创建新对象，直接使用老对象
     * 好处：减少内存开销，提高性能
     */
    @Test
    public void testStrings(){
        String s1="java123"; //公共常量池
        String s2="java123"; //不会创建对象，从常量池java123
        System.out.println(s1==s2); //ture
        String s="java";//s对象 不可修改
        String s3=s+"123";//s3对象+s对象+“123”； s3新对象
        System.out.println(s==s3); //java123 ==java123 true
        String s4="java"+"123";
        //右侧：直接量方式拼接，静态字符串，存入常量池当中
        System.out.println(s2==s4); //tyre
        //s2的java123从常量池中获取，s4拼接后静态字符串，从常量池中获取
        //--------上面的代码：给定值定义字符串方式：拥有常量池----------
        //--------下面的代码:创建字符串对象方式------
        String s5=new String("java123");
        //new出来的对象：一定是新对象，不存在常量池
        System.out.println(s4==s5);
    }
    /**
     * String API 方法
     * length方法   返回值：int
     * 作用：返回当前字符串的长度（个数）---借鉴与数组length方法
     * 特点：字符串包含：特殊字符空格、字母、汉字
     *      String对象采用Uincode顶级编码：每个字符串算1个，占2个字符
     */
    @Test
    public void testLength(){
        String str="hello world";//10
        System.out.println(str.length());
        str="我爱Java";
        System.out.println(str.length());

    }
    /**
     * indexOf方法---重载功能：修饰符 返回值 方法名 一致
     *                                   参数值 不一致
     * indexOf（int index）返回值：int
     * 第一个参数：String index：传入下标位
     * 作用：查找指定字符串在当前字符串中位置，首位置
     *      如果匹配对应字符，输出首位置下标
     *      如果没有匹配对应字符，返回值-1
     * indexOf（String str，int index）返回值：int
     * 第一个参数 String str：传入指定字符串
     * 第二个参数 int index：查找指定具体位置的下标
     * 作用：查找“具体下标位”的“字符串”在“当前字符串”中位置，首位置
     *      如果查找相同名称，向下一位查找，不包含当前位置
     *      如果没有匹配对应的字符，返回值-1
     * lastIndexOf（String str）方法
     * 作用：找到匹配字符串中对应最后出现字符串的位置
     */
    @Test
    public void testIndexOf(){
        String str="think in java";//java编程思想【第四版】
        //返回值，下标位
        int index=str.indexOf("in");
        System.out.println("打印下标位"+index);
        index=str.indexOf("in",6);
        //用处：查找指定某一位相同
        System.out.println("指定下标位："+index);
        //lastIndexOf（）找到最后一次出现的下标位置
        index=str.lastIndexOf("in");
        System.out.println("最后的下标位:"+index);
    }
    /**
     * StringAPI针对字符串提供三种方法：截取、替换、分割
     * subString方法     截取     返回值：String
     * 作用：截取字符串，从下标start位置开始截取，截取到end下标位置
     * subString（int index） 返回字符串
     * 作用：截取字符串，从下标index位置开始截取，截取到最后
     * 通过口诀：含头不含尾
     */
    @Test
    public void testSubString(){
        String url="www.baidu.com";//需求：通过截取字符串baidu
        url.substring(4,9);
        System.out.println("截取子字符串："+url);
        //需求：通过截取字符串 .com
        url= url.substring(9);
        System.out.println("截取字符串截取到最后"+url);
    }
    /**
     * charAt（int index）方法    返回值char
     * 作用：返回当前字符串中指定位置的字符
     * StringIndexOutOfBoundsException 异常
     * 字符串下标越界异常---出现原因：下标超出范围
     */
    @Test
    public void testCharAt(){
        String str="thinking in java";
        char c=str.charAt(15);
        System.out.println("获取对应字符："+c);
    }
    /**
     * trim方法 返回值String
     * 作用：去掉当前字符串前后空格【转大小写叠加使用】
     * 统一转换大小写，去掉空格之后
     *
     * toLowerCase方法   返回值String
     * 作用：将字符串中所有字符转换为小写
     * toUpperCase方法   返回值String
     * 作用：将字符串中所有字符转换为大写
     * 验证码：xD4e   前台显示：xD4e  用户输入：xd4e
     */
    @Test
    public void testTrim(){
        String str=" xD4e ";//后台出入前后都加空格，xD4e判断
        //后台输入前台字符串---一律空
        str=str.trim().toLowerCase();
        System.out.println("去掉空格："+str);
    }
    /**
     * replace方法   替换   返回值：String
     * 作用：可以将字符串中指定范围内“内容”替换成给定的内容
     *      含头不含尾
     * replace（int start，int end.String str）
     *         开始位置，结束位置，替换内容
     */
    @Test
    public void testReplace(){
        //创建StringBuilder可变字符串类,构造器中直接传字符串
        StringBuilder sb=new StringBuilder("你就是我的小可爱");
        sb=sb.replace(5,8,"小baby");
        System.out.println(sb);
    }

    /**
     * insert方法   插入   返回值：String
     * 作用：将给定的字符串插入到当前字符串中某个位置
     * insert（int index，String str）
     *        插入位置     插入内容
     */
    @Test
    public void testInsert(){
        //创建：可变字符串对象
        StringBuffer sb=new StringBuffer("你就是我的小可爱");
        sb=sb.insert(8,"今天");
        System.out.println(sb);
    }
    /**
     * 考试题
     * StringBuilder和StringBuffer的区别
     * StringBuilder和StringBuffer---方法完全一致【追加、载入、替换】
     * StringBuilder------JDK1.0----线程安全【效率低】
     * StringBuffer------JDK1.5----线程不安全【效率高】
     *
     * 需求说明书：模块用什么类【标注】  业务
     */
}

